package br.com.controller.diretor;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.controller.util.CPFValidator;
import br.com.data.hibernate.DiretorHibernateDAO;
import br.com.data.hibernate.EscolaHibernateDAO;
import br.com.data.hibernate.ProfessorHibernateDAO;
import br.com.data.hibernate.TurmaHibernateDAO;
import br.com.data.hibernate.UsuarioHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Diretor;
import br.com.model.entidade.Escola;
import br.com.model.entidade.Professor;
import br.com.model.entidade.Progresso;
import br.com.model.entidade.Turma;
import br.com.model.entidade.Usuario;
import br.com.util.setup.StringToMD5;

@ManagedBean
@ViewScoped
public class MBDiretor extends AbstractMBean<Diretor>{
	private DiretorHibernateDAO diretorHibernateDAO;
	private EscolaHibernateDAO escolaHibernateDAO;
	private ProfessorHibernateDAO professorHibernateDAO;
	private UsuarioHibernateDAO usuarioHibernateDAO;
	private Diretor Diretor;
	private List<Diretor> Diretores;
	private String senhaRepetida;
	private String escola;
	private boolean vizualizavel;
	private boolean editavel;
	private Diretor diretorVisualizacao;
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBDiretor(){
		
		this.diretorHibernateDAO = (DiretorHibernateDAO) getBean("diretorHibernateDAO");
		this.professorHibernateDAO = (ProfessorHibernateDAO) getBean("professorHibernateDAO");
		this.escolaHibernateDAO = (EscolaHibernateDAO) getBean("escolaHibernateDAO");
		this.usuarioHibernateDAO = (UsuarioHibernateDAO) getBean("usuarioHibernateDAO");
		limpar();
		
	}

	public void gerarMatricula(){
		boolean teste = true;
		
		while(teste){
			Date d = new Date();
			String matricula = (d.getYear()+1900) + "";
			int num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			num = (int) (Math.random() * 10);
			matricula += num + "";
			
			if (usuarioHibernateDAO.getByField(Usuario.class, "matricula", matricula) != null){
				if (usuarioHibernateDAO.getByField(Usuario.class, "matricula", matricula).isEmpty()){
					this.Diretor.getUsuario().setMatricula(matricula);
					teste = false;
				}
			}
		}
		
		
	}
	
	public void irEditar(){
		editavel = true;
		escola = Diretor.getEscola().getNome();
	}
	
	public void mudarVizualizar(){
		vizualizavel = !vizualizavel;
		
		if (vizualizavel) {
			escola = Diretor.getEscola().getNome();
		}else{
			limpar();
		}
		
	}
	
	public void excluir(){
		try {
			System.out.println(Diretor.getId());
			serviceCadastro.excluir(Diretor);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Diretor excluido com sucesso!"));
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao excluir!"));
		}
	}
	
	public void editar(){
		try {
			System.out.println("entrei no editar, o nome do Diretor eh " + Diretor.getUsuario().getNome());
				
			Diretor.setEscola(escolaHibernateDAO.getByField(Escola.class,"nome", escola).get(0));
			serviceCadastro.atualizar(Diretor);
			this.limpar();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Diretor cadastrado com sucesso!"));
		
			
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
	}
	
	
	public void cadastrar(){
		
		
		
		
		try {
			List<String> listaPermissoes = new ArrayList<String>();
			if ((this.Diretor.getUsuario().getSenha().compareTo(senhaRepetida)==0) || (Diretor.getUsuario().getId() != null)){
				System.out.println("entrei");
				Diretor.setEscola(escolaHibernateDAO.getByField(Escola.class,"nome", escola).get(0));
				if(Diretor.getUsuario().getId() == null){//verifica se o diretor veio de um professor
					
					System.out.println("o id eh null");
					listaPermissoes.add("DIRETOR");
					Diretor.getUsuario().setPermissoes(listaPermissoes);
					Diretor.getUsuario().setSenha(StringToMD5.md5(senhaRepetida));
					System.out.println("setei  aenha");
				}else{
					System.out.println("uhull");
					Professor prof = (Professor) professorHibernateDAO.getByField(Professor.class, "usuario",Diretor.getUsuario()).get(0);
					System.out.println("peguei o prof");
					if(prof.getEscolas().contains(Diretor.getEscola()) ){
						System.out.println("o Usuario eh " + prof.getId());
						
						System.out.println("o professor eh " + prof.getUsuario().getNome());
						listaPermissoes = prof.getUsuario().getPermissoes();
						System.out.println("Lista: " + listaPermissoes);
						listaPermissoes.add("DIRETOR");
						System.out.println("adicionei a permissao");
						Diretor.getUsuario().setPermissoes(listaPermissoes);
						System.out.println("deu tudo certo aq");
					}else{
						addFacesErrorMessage("O Diretor não pode ser cadastrado para esta escola");
						return;
					}
				}
				
				if (!this.Diretor.getUsuario().getCpf().isEmpty() || CPFValidator.validar(this.Diretor.getUsuario().getCpf())){
					System.out.println("vou cadastrar");
					
					Usuario u = Diretor.getUsuario();
					if (u.getId() == null) {
						this.gerarMatricula();
						serviceCadastro.salvar(u);
					}else{
						serviceCadastro.atualizar(u);
					}
					Diretor.setUsuario(u);
					
					serviceCadastro.salvar(Diretor);
					
					this.limpar();
					FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Diretor cadastrado com sucesso!"));
				}else{
					addFacesErrorMessage("CPF Inválido");
				}
				
				
			}else{
				FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Aviso", "Senhas nao conferem!"));
			}
			
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Erro", "Erro ao cadastrar!"));
		}
		
	}
	
	
	
	
	public Diretor getDiretorVisualizacao() {
		return diretorVisualizacao;
	}

	public void setDiretorVisualizacao(Diretor diretorVisualizacao) {
		this.diretorVisualizacao = diretorVisualizacao;
	}

	public void limpar(){
		try {
			this.Diretores = diretorHibernateDAO.listAll(Diretor.class);
		} catch (BDException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.Diretor = new Diretor();
		this.senhaRepetida = "";
		this.escola = "";
		vizualizavel = false;
		editavel = false;
	}
	
	
	
	public Diretor getDiretor() {
		return Diretor;
	}

	public void setDiretor(Diretor Diretor) {
		this.Diretor = Diretor;
	}

	public List<Diretor> getDiretores() {
		try {
			this.Diretores = diretorHibernateDAO.listAll(Diretor.class);
		} catch (BDException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return this.Diretores;
	}

	public void setDiretores(List<Diretor> Diretores) {
		
		
		this.Diretores = Diretores;
	}

	public String getSenhaRepetida() {
		return senhaRepetida;
	}

	public void setSenhaRepetida(String senhaRepetida) {
		this.senhaRepetida = senhaRepetida;
	}

	public String getEscola() {
		return escola;
	}

	public void setEscola(String escola) {
		this.escola = escola;
	}


	public boolean isVizualizavel() {
		return vizualizavel;
	}


	public void setVizualizavel(boolean vizualizavel) {
		this.vizualizavel = vizualizavel;
	}


	public boolean isEditavel() {
		return editavel;
	}


	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}
	
	
	
}
